package red;


import arjuna.JavaSim.Simulation.*;
//import arjuna.JavaSim.Distributions.*;

//import java.io.IOException;
import arjuna.JavaSim.Simulation.SimulationException;

public class Machine extends SimulationProcess {
	
	public Machine(double service_time , int host) {
		serviceTime=service_time;
		working = false;
		J = null;
		Q = new Queue();
		processedJobs = 0;
		idhost=host;
		petitionActivate=false;
	}

	public void run() {
		for (;;) {
			
			working = true;
			while (!Q.IsEmpty()) {
				try {
					J = Q.Dequeue(); // sale de la cola
					if(J.getServidor()==idhost)
					{
						double tServicio = serviceTime;
						Hold(tiempoTrabajo()); // esta en el servidor sirviendose
						processedJobs++;
						MachineShop.servidor[J.getCliente()].setPetitionActivate(false);
						J.finished();
					}
				}
				catch (SimulationException e) {
				} catch (RestartException e) {
				}
				
			}
			working = false;

			try {
				Cancel();
			} catch (RestartException e) {
			}
		}
	}

	
	private double tiempoTrabajo()
	{
		double tiempo;
		int activos=0;//nodos en marcha
		for(int i=0 ; i<MachineShop.nodos; i++)
		{
			if(MachineShop.servidor[i].working)
			{
				activos++;
			}
		}	
		
/*       divido el tiempo que cuesta un paquete por el numero de nodos que lo estan usando para saber cuanto tardara        */
			tiempo=(MachineShop.tiempoServicio*activos)/MachineShop.AnchoBanda;
			System.out.println (tiempo);
			return tiempo;
		
	}
	
	
	public boolean getPetitionActivate()
	{
		return petitionActivate;
	}

	public void setPetitionActivate(boolean variable)
	{
		petitionActivate=variable;
	}
	
	public void Request(Job trabajo) {
		// no la retransmiten throws SimulationException, RestartException {
		Q.Enqueue(trabajo);
//		System.out.println("Encolado");
		if (!working) {
			try {
				MachineShop.servidor[trabajo.getCliente()].setPetitionActivate(true);
				Activate();
			} catch (SimulationException e) {
			} catch (RestartException e) {
			}
				
		}
	}

	public long QueueSize() {
		return Q.QueueSize();
	}

	public long ProcessedJobs() {
		return processedJobs;
	}

	public boolean Processing() {
		return working;
	}

	private boolean petitionActivate;
	private int idhost ;
	private long processedJobs;
	private Queue Q;
	private boolean working;
	private Job J;
	private double serviceTime;
}
